/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 沈明月
 * Date: 2023-01-01
 * Time: 15:01
 */

//抽象类
//在面向对象中，所有的对象都是通过类来描绘的，
//但是反过来，并不是所有的类都是用来描绘对象的
//如果一个类中没有包含足够的信息来描绘一个具体的对象
//这样的类就是抽象类
//抽象类也是类，它可以包含抽象方法、普通方法和属性，甚至可以包含构造方法

//协变类型：重写的两个方法的返回值构成父子关系

//抽象类和普通类有什么区别：
//抽象类不能实例化，普通类可以
//抽象类中可以包含抽象方法和非抽象方法，但是普通类不能包含抽象方法

//抽象类用abstract来修饰
//抽象类不能实例化
/*abstract class Shape{//抽象类
    public void draw(){
        System.out.println("画图形！");
    }
}

public class KnowledgeOne {
    public static void main(String[] args) {
        //Shape shape = new Shape();---->wrong
    }
}*/



/*
abstract class Shape{
    public abstract void draw();//加了abstract以后，可以不写具体的实现了（抽象方法）
    //要实现的话就不能在方法里面加abstract（非抽象方法）

    //抽象方法：方法被abstract修饰，不包含具体的实现
}

public class KnowledgeOne {
}*/


//抽象类就是为了被继承的，当一个类继承自抽象类以后，抽象类里面的抽象方法必须要重写
//抽象类存在的最大的意义就是被继承，所以抽象方法不能被private，final，static修饰
//抽象方法一定要满足重写的规则
//抽象类必须被继承，并且继承后子类要重写父类中的抽象方法，否则子类也是抽象类方法，必须要用abstract修饰
//当一个子类没有重写抽象的父类的方法，可以把当前子类用abstract修饰，但是当这个类再次被继承的时候，还是得重写最初始的那种方法
/*
abstract class Shape{
    public abstract void draw();
}

class Rect extends Shape{
    @Override
    public void draw() {
        System.out.println("◻");
    }
}

class Cycle extends Shape{
    @Override
    public void draw() {
        System.out.println("⚪");
    }
}

class Flower extends Shape{
    @Override
    public void draw() {
        System.out.println("❀");
    }
}
public class KnowledgeOne {
}*/

/*abstract class Shape{
    abstract public void draw();
}
abstract class Rect extends Shape{
    abstract public void write();
}
class B extends Rect{
    public void write(){
        //……
    }
    public void draw(){
        //……
    }
}*/

